eeifandomcom_gl-20200213-history
LPR-Python
O obxectivo desta páxithumb|left|258pxna da wiki é aportar coñecementos básicos para programar en Python, baseándose nos paradigma estrutural o paradigma orientado a obxectos, o paradigma funcional e o lóxico. Actualmente está en construción e calquera colaboración será benvida. Comecemos: ''Introducción: Para comezar, é importante dicir que Python é unha linguaxe interpretada, polo tanto, para poder probar os nosos programas usaremos un intérprete, non un compilador. As distribucións actuais de Linux traen un intérprete de Python incorporado e para windows hai varias opcións , como o programa Idle. Cada instrución non vai separada de punto e coma(;) , polo que as instrucións escríbense en liñas unha debaixo da outra e non todo nunha soa liña(como hai a posibilidade en linguaxes varias como C , C++ o Java). Outra diferencia importante con moitas linguaxes é que para facer os bloques de código, isto é, código que se quere agrupar para que faga unha funcionalidade determinada(tipicamente, o código dunha función) non se usan corchetes de apertura e peche, senón que se usa indentación, un termo que ven do inglés e que ven a dicir que en lugar de usar corchetes hai que usar tabulacións: isto é, o nivel de "englobamento" é de esquerda a dereita, tendo en conta que o que está máis á esquerda ten máis prioridade que o que está á dereita. Así, definiríamos a nosa función e na liña de abaixo , como mínimo cunha columna de separación definiríamos o noso código. Un exemplo poderiá ser este: Ex: def suma(a,b): return a+b Como se pode observar no exemplo, para definir unha función(en Python non estña implementado o concepto de Procedemento) ponse a palabra reservada def, un espacio , o nome da función , os parámetros entre paréntese a seguir e o caracter ":" para indicar o comezo da función. Como indiquei antes non se usan chaves. Outra cousa básica é como facer comentarios: ao igual que en bash(unix) , úsase o caracter "#" para comentar unha liña. Para importar unha librería simplemente hai que poñer a palabra reservada import e o nome da librería en cuestión. Se só queremos importar unha parte do módulo, poñeríamos a palabra reservada from, un espacio, nome do módulo, a palabra reservada import e o nome do que queremos importar Algo importante a ter en conta é que as variables non se declaran. Isto é, no momento que se quere usar unha variable simplemente se decide un nome e úsase, aínda que sí poden ser inicializadas a un valor o cal , dependendo do valor que sexa fará que a variable sexa dun tipo ou doutro. Operadores matemáticos Python ten os operadores matemáticos básicos, e úsanse igual que en C++ ou Java.Así, temos os operadores +,-,*,/,%,<=,>= que serven para sumar, restar, multiplicar, dividir, facer o módulo , poñer < ou igual e poñer > ou igual. Para saber se un número é igual que outro úsase tamén o operador . Aparte destes operadores, Python ten moitas librerías matemáticas, como math. A documentación sobre math pódese atopar aquí: http://docs.python.org/library/math.html . Hai outras librería como numpy ,scipy ou matplotlib que son moito máis potentes e que non veñen instaladas de serie. Unha búsqueda rápida en google daaá coa documentación ;) 'Texto' Para comezar, o comando básico para imprimir texto en Python é print. Así, podemos imprimir o valor dunha variable poñendo a palabra reservada print e o nome da variable. Tamén podemos imprimir unha cadea de texto poñendo print asdasdsa , o que imprimirá asdasdsa por pantalla. Se queremos imprimir unha cadea por pantalla podémolo facer con comiñas(dobres) ou sen comillas. No pódese usar %d , %s , %r....para imprimir enteiros, strings ou reais respectivamente. Así, se poñemos algo como : x = 10 print "Isto e un numero %d " % x O anterior imprimiría o valor de x. Tamén existen \n para salto de liña, \t para tabulación.... O comando print é o comando básico que se usa para imprimir, pero hai ferramentas moito máis potentes. Por exemplo, format permítenos especificar o formato de saída dun texto para adaptalo ás nosas necesidades. Así, con formar podemos especificar moitas cousas, como a orde na queremos que se impiman os parámetros ou a maneira de separalos. Así, para usar format habería que definir primeiro o patrón, que sería de tipo string e despois invocar a format dado que format é do módulo de string. Así, un exemplo sería: def imprimir(x,w,f): formato= "{0:" + str( w ) + "." + str( f ) + "f}" #Isto indica que se imprime o primeiro argumento, logo un punto e logo o número de 0s indicado no terceiro argumento. print ( formato.format( x ) ) imprimir(4,1,1) imprimir(7,3,2) Onde imprimiríamos un número, seguido do carácter "." e o número de 0 que se queira. Así , a primeira chamada daría como resultado 4.0 e a segunda chamada daría como resultado 7.00 Se queremos poñer un texto para que o usuario introduza un texto , usaremos a función raw_input. A documentación do módulo string , que contén a función format e o resto de funcións da librería en : http://docs.python.org/library/string.html Estruturas de decisión '' As estruturas iterativas son aquelas que nos permite definir dúas (ou máis) alternativas de execución do noso código. Así,a estrutura básica usada para isto son as estruturas if - else, que teñen a seguinte sintaxe: if condicion : codigo else: codigo Así, simplemente definimos as condicións despois da palabra reservada if ou else , poñemos ":" e escribimos o código a executar. Non é obrigatorio usar un if-else, isto é , para poder usar un else sempre ten que haber un if ou un elif(do que falaremos en breve) previo pero pode usarse un if sen necesidade de else, cando só queremos facer algo no caso de que se cumpra unha condición sen dar outra alternativa. Non existe a estrutura switch-case de C ou Java , polo que en Python para facer algo similar úsase elif, isto é , un else no cal é posíbel especificar unha condición . E ti dirás, que diferencia hai co else logo? Pois que podes encadear un if con infinitos elif, mentres que só podes encadear un else cun if. Así, é posíbel substituír o último dos elif que necesitemos por un else, aínda que non necesario. A sintaxe sería: if condicion : codigo elif condicion : codigo elif condicion : codigo . . . else condicion: codigo Para definir as condicións dos if ,else ou elif hai que ter en conta que evalúa expresión booleanas: isto é, evalúan se algo ten o valor true ou false. Así, podemos evaluar expresións do tipo >= , , <= (sempre que o tipo de variable o permite) ou calquera outra expresión que devolva true ou false. 'Operadores lóxicos' Amplamente relacionado co apartado anterior está este apartado, no cal trataremos os diversos operadores lóxicos que hai en Python. Para comezar, dicir que hai que esquecerse de usar "&&" e "||" ao estilo doutras linguaxes xa que aquí eses símbolos substitúense por "and" e "or" respectivamente. Así,de xeito nativo, non é posíbel usar o símbolo "&"(ámpersand simple) ou "|" (or simple) . EXisten tamén funcións para comparar números(similares as que hai en BASH(unix)) que son le, gt, eq, lt, e ne. (le_> less or equal, gt -> greater than,eq-> equal, lt-> little than, ne ->not equal). Aparte , hai outros operador interesantes como not , que o que fai é negar , podéndose usar para definir unha condición na que non queiramos que se cumpre un valor ou incluso a función xor , que como ben indica o seu nome fai unha xor entre dous parámetros. Toda a documentación dos operadores lóxicos(ademáis dos outros operadores está en: http://docs.python.org/library/operator.html 'Estruturas de repetición ou iterativas.' Para comezar, non hai o bucle do....while que hai noutras linguaxes(un bucle que, na miña opinión, é útil só en contextos moi determinados). Así, os bucles que hai, isto é, as maneiras para realizar unha acción un número de veces definido mentres se cumpre unha condición son o bucle for e o bucle while. O bucle for funcoina de diferente modo que en C ou Java, xa que no nse lle especifica unha condición e recórrese unha lista de obxectos desde o primeiro ata o último, tendo que especificar as posibles condición de rotura do bucle a base de estruturas de tipo if . Así , a sintaxe sería: for i in lista: print a Sendo lista un obxecto de tipo list , tipo de dato que se tratará posteriormente. Así, hai que matizar que para recorrer as listas o bucle for o que fai é crear un iterador automaticamente(o concepto de iterador explicarase posteriormente) de xeito que o contido de "a" imprimiríase tantas veces como elemtos tivese a list lista. É moi común crear listas para recorrer o momento no momento de executar o bucle usando a función range. A outra estrutura que Python ten para os bucles é o bucle while, que executará o código que está incluido dentro do seu bloque de indentación(máis á dereita que onde está o while) de xeito que a primeira vez que non se cumpra a condición sairá do bucle. A sintaxe é a seguinte: while condicion: codigo Dicir tamén que en Python existe break , unha ferramenta que permite cortar a execución dun bucle no momento en que é executado. 'Tipos de datos en Python: Tipos base' En Python existe o tipo int , float , double , long , bool e str(string). Así, para declara unha variable dun tipo determinado(aínda que recordo que non é necesario declarar as variables xa que se non se fai son construídas en tempo de execución) escríbese o tipo da variable, un espazo e o nome da mesma. Así, por exemplo: int variable Hai outros tipos que se poderían considerar base, como é o tipo None ou o tipo complexo. Ademáis , é posíbel definir tipos propios (ao estilo dos xenéricos de Java). Máis información en : http://docs.python.org/library/functions.html Casteos Para convertir un variable dun tipo noutro tipo hai que casteala. Python fai un casteo implícito cando almacena nunha variable un dato(por exemplo, a = 5, implicitamente a é un int). Sen embargo, hai moitas ocasións nas que é necesario facer un casteo expllícito . Para facelo simplemente hai que poñer as iniciais do tipo de dato e entre paréntesis a variable. Ex: chr(a) convertiría a char a variable a. Así, as función de casteo que hai son int(nome_variable), float(nome_variable), chr(nome_variable), double(nome_variable), str(nome_variable) , list(nome_variable) e dict(nome_variable) . Hai algunhas máis pero esas son as máis importantes. 'Tipos de datos en Python: estruturas' A estrutura básica en Python son as listas, obxectos da clase list. Sen embargo, existen outras estruturas importantes coma os diccionarios , as tuplas e os arrays. 'Listas' Así, as listas en python aseméllanse bastante ao concepto de "vector" doutras linguaxes de programación: isto é, contedores de elementos no que cada elemento ten un índice. Para declarar unha lista escribiríamos o nome da lista e inicializáriamola a "[]" para indicar o caracter vacío da mesma, ou con elementos no caso de ser así requerido. Así, para declarar unha lista con elementos farémolo separando os elementos por comas, "1,2,3" , podendo ser a lista de calquera dos tipos de Python(incluso unha lista de listas). Un exemplo sería: lista =[] #declaración dunha lista baleira lista2= 1,2,3 # declaración dunha lista con valores de tipo int Hai diferentes funcións para traballar con listas en Python. Así, supoñendo o nome da lista "lista", teríamos as seguintes funcións: lista.append(elemento): engade un elemento ao final da lista. lista.pop(): quita un elemento da lista(o último introducido) lista.insert(pos,elemento): inserta o "elemento" na posición "pos". lista.remove(elemento): borra o primeiro elemento da lista cuxa valor coincida con "elemento" , recorrendo de esquerda a dereita. lista.count(elemento): devolve cantas veces aparece "elemento" na lista del lista : borra a lista "lista" del lista0 : borra o elemento da posición 0 de "lista" Un exemplo de todo o anterior sería: lista =1,2,3 #declaración da lista con 1,2,3 lista.append(4) print lista #lista valería 1,2,3,4 lista.pop() lista.pop() print lista # lista valería 1 lista.append(5) lista.append(5) lista.append(5) lista.append(5) print lista #lista valería 1,5,5,5,5 lista.remove(5) lista.insert(0,23) print lista # lista valería 23,1,5,5,5 Como se pode ver no exemplo anterior as listas son facilmente manipulábeis e podemos facer que se comporten como colas. Se escribimos lista: estaremos creando unha copia de lista e se escribimos lista0:5 estaremos seleccionando os seis primeiros elementos da lista. Así, é posíbel usar índices negativos nas listas , por exemplo, algo como lista-5 accedería ao elemento 5 comezando a contar pola dereita. E se escribimos algo como lista-5: devolveríanos unha lista con tódolos elementos desde a posición 5 comezando a contar pola dereita ata o final da lista. Así, cando especificamos un rango ao acceder a un elemento devólvenos unha lista cos elementos en cuestión. En Python 3 a list comprehension é un recurso moi usado : tal concepto explicarase ao falar das funcións map , filter e reduce no paradigma da programación funcional. 'Diccionarios' Os diccionarios son unha estrutura similar as listas, aínda que con moitas menos funcións para manexalos. Así, un diccionario está composto por diversos pares de elementos clave-valor, de forma que poderase saber onde está un valor ,borralo,....pola súa clave. Declararíamos un diccionario con nome_diccionario = {'clave':valor,.........,'clave':valor} , podendo almacenar o número de valores que queiramos; iso sí, cada clave e única polo será imposíbel ter dous elementos coa clave '1' pero si será posíbel ter varios elementos 1 con diferente clave cada un. Para acceder a cada elemento do diccionario escribiríamos nome_diccionario'clave' , borrándoos igual que nas listas escribindo del nome_diccionario'clave' . Existe unha función keys(), que o que fai é devolver unha lista con tódalas claves do diccionario, de forma que se escribimos nome_diccionario.keys() devolveranos unha lista con tódalas claves do diccionario . Seguindo coas claves, é posíbel saber se un elemento está no diccionario usando a palabra reservada "in" , escrinbindo 'clave' in nome_diccionario. Comentar que existe unha función dict() que comvirte unha lista de par -valo (algo como ('1',a),('2',b) ) nun diccionario. Agora un exemplo para explicar mellor o seu funcionamento: >>> tel = {'jack': 4098, 'sape': 4139} >>> tel'guido' = 4127 >>> tel {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel'jack' 4098 >>> del tel'sape' >>> tel'irv' = 4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> tel.keys() 'irv', 'jack' >>> 'guido' in tel True >>> dict(4139), ('guido', 4127), ('jack', 4098)) {'sape': 4139, 'jack': 4098, 'guido': 4127} >>> dict(x**2) for x in (2, 4, 6)) # use a list comprehension {2: 4, 4: 16, 6: 36} Para ver información de tuplas e máis cousas sobre listas e diccionarios visitar o seguinte enlace: http://docs.python.org/tutorial/datastructures.html e visitar a sección desta páxina de wiki sobre programación funcional Lectura, escritura e outras operacións con ficheiros Os ficheiros son unha estrutura moi útil que nos permiten almacenar información para poder acceder a ela posteriormente. Python ten varias funcións para manexar os ficheiros: Para abrir un ficheiro usaremos a funcion open(nome_ficheiro,'modo') . O modo pode ser w para escribir ou r para só lectura. Hai máis modos, como a para engadir a un ficheiro , b para modo binario e r+ para abir un ficheiro en modo lectura e escritura(non é obrigatorio especificar o parámetro do modo dentro da función open). Así , unha vez aberto o ficheiro, se queremos escribir nel teríamos que escribir (tendo en conta que almacenaríamos o resultado da función open (neste exemplo supoñamos a variable a) a.write("algo"). Nótese que iso escribiría unha cadea, pero poderíamoslle pasar o resultado dun raw_input, recorrer unha lista e escribila,etc. Unha vez que rematamos de escribir poñemos a.close(sendo "a" a variable co resultado de open) para pechar o fluxo de datos co ficheiro. Se quixésemos borrar o ficheiro poñeríamos a.truncate() . Introducindo a.read() leríamos todo o ficheiro dunha soa vez.Pola contra, se quixésemos ler só unha liña sería a.readline(). Usando a función readlines() , faría o mesmo que read() só que metería o contido de todo o que leu nunha lista(saltos de liña incluidos no caso de habelos). Non fai falla usar nin readline() nin readlines() para ler un ficheiro: o modo máis simple de facelo sería usar un bucle for do estilo for f in fichero:(sendo fichero un ficheiro aberto para lectura) print f Usando a función tell() devolvería un enteiro coa posición do obxecto de tipo file (un ficheiro) na que se atopa(Exemplo: abrimos o ficheiro con open e logo facemos un write('aaa'). Se o ficheiro estivese vacío devolvería un 4). Pódese cambiar a posición onde está a leer con seek(offser, de_onde), función na que podemos especificar o bit ao que queremos "mover a lectura".Imos cun exemplo do explicado ata agora sobre ficheiros: >>> f = open('/tmp/workfile', 'r+') #abrimos o ficheiro en modo escritura >>> f.write('0123456789abcdef') #escribimos iso >>> f.seek(5) # Imos ao sexto byte(antes de executar isto estamos nobyte nº 17) >>> f.read(1) #lemos '5' >>> f.seek(-3, 2) # Vai ao terceiro byte antes da fin do ficheiro >>> f.read(1) 'd' O uso das función anteriores pode resultar confuso e sobretodo tedioso nalgúns casos, dahí que sexa convinte usar o módulo pickle nalgunhas ocasións. Así, este módulo ten dúas funcións: unha función dump para "volcar" contido nun ficheiro e unha función load para cargar contido dun ficheiro. Desvantaxe? Que cando miramos o contido do ficheiro non é lible, isto é, cando fas o dump o resultado só é interpretable despois de executar un load. Un exemplo sería: pickle.dump(x, f)#x é unha variable (que ten algo que escribir(un string, por exemplo) e f é un ficheiro que foi aberto para escritura. x = pickle.load(f) #carga en x o ficheiro f Uso de excepcións Mediante excepcións pódense controlar o fluxo de erro dos nosos programas. Así, as dúas palabras reservadas que serven para manexar excepcións son try e except. Así, dentro do bloque de try escribiríamos o código a avaliar e despois do código escribiríamos un except coas excepcións e como tratalas. Hai varias excepcións xa predefinidas en Python como ZeroDivisionError, ValueError, TypeError, ..... Poden controlarse varias excepcións ao mesmo tempo separadas por comas.Basicamente, o modo de funciona,ento sería: 1- O bloque dentro de try é comprobado 2- compróbase se se cumpre a excepción 3- Faise o que se especifique no bloque except. Un exemplo sería: while True: try: x = int(raw_input("Please enter a number: ")) break except ValueError: print "Oops! That was no valid number. Try again..." Existe unha cláusula else opcional , útil cando queremos que se execute algo no caso de non saltar unha excepción. Un exemplo sería: for arg in sys.argv1:: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close() Existe tamén a función raise() para lanzar excepcións , que o que fai é forzar unha excepción: >>> try: ... raise NameError('HiThere') ... except NameError: ... print 'An exception flew by!' ... raise ... An exception flew by! Traceback (most recent call last): File "", line 2, in ? NameError: HiThere Non tódalas excepcións poden ser contempladas polo que o programador pode definir as súas propias creando unha clase de excepcións (aínda non se comentou o manexo de clases polo que poño o link para aquel que está interesad@, ademáis de máis información sobre erros e excepcións): http://docs.python.org/tutorial/errors.html Expresións regulares: o módulo re Funcións Para poder traballar con expresións regulares en python hai que importar o módulo re (import re ). Unha vez feito isto temos á nosa disposición unha serie de funcións para o uso de expresións regulares, así como metacaracteres e outras ferramentas para a construción de expresións regulares. Comecemos coas funcións: Ao usar unha expresión regular o que buscamos é saber se un string coincide cun determinado patrón. Así, a función re.match(elemento_a_buscar,onde_buscar) tentará atopar o elemento_a_buscar(que será unha expresión regular) dentro do segundo parámetro. Así, esta función devolve true ou false: true no caso único e exclusivo de atopar coincidencia ao comezo do string do segundo parámetro e false en caso contrario;. Nótese que a expresión regular ten que ir entre comiñas(simpres ou dobres). A función match será a que usaremos no caso de saber se unha cadea cumpre ou non un patrón , sen embargo se o que queremos saber é se o patrón se atopa dentro da cadea pero non ten por que cumprilo usaremos re.search(elemento_a_buscar,onde_busca). Un exemplo sería: >>> re.match("c", "abcdef") # Non hai coincidencia >>> re.search("c", "abcdef") # Sí hai coincidencia O método que acabo de mencionar está ben, sen embargo, se se quere facer dun xeito máis eficiente (sobre todo se a expresión regular se usa moitas veces no programa ) usaremos a función re.compile(expr_regular,flag) coa que convertiremos a expresión regular nun obxecto de tipo expresión regular, podendo usalo depois con re.search ou re.match. O parámetro flag serve para modificar a coincidencia, por exemplo, facéndoo case-sensitive. Así, hai varias cousas que poderían ser flags como re.IGNORECASE(para ignorar a diferenza entre maiúsculas e minúsculas) . Con re.findall(expresión regular, cadea) devolveríanos unha lista de strings con tódalas coincidencias atopadas na cadea na que buscamos . Logo está re.finditer(expresión regular, cadea) , que como ben indica o seu nome devolve un iterador que podemos usar , por exemplo nun bucle for(for i in re.finditer("a",cadea) :) , podendo comprobar en cada caso se se cumpre ou non a expresión regular grazas ao valor da variable coa que recorremos o bucle. Se quixésemos facer un split , isto é , quedarnos só cun pedazo dunha cadea , usaríamos re.split(patrón, cadea a buscar) , que nos devolvería unha lista cos resultados e se quixemos remprazar parte dun string usaríamos re.sub(expr_regular, remprazo,cadea), que devolvería un string. Hai máis funcións sobre expresións regulares, pero considerouse que as aquí mencionadas son as máis útiles e que serven para as operacións máis comúns.Consultar a sección Máis Información deste apartado para ampliar sobre o tema. Construción de expresións regulares. Para comezar, hai que poñer a expresión regular a usar coas funcións mencionadas no apartado anterior entre comiñas, ben sexa dobres ou simpres. Un detalle a ter en conta a hora de construír expresións regulares en python é que varía un pouco o xeito de escapar os caracteres: isto é, noutras linguaxes con poñer \caracter xa chega para que perda o seu siñificado. Iso en Python non se pode facer dado que ese carácter xa é usado para iso mesma para os string literals ''. Así, se quixésemos escapar o caracter "/" , teríamos que escribir "////" .Para solucionar isto recoméndase o uso dunha notación similar á dos string co carácter r. Así, r"\n" é un string que contén 2 caracteres: "\" e "n" , mentres que "\n" só contén un caracter: "\n". Unha expresión regular(en Python e noutras linguaxes) componse de patróns e metacaracteres para especificar o número de repeticións dun patrón. Así, existen multitude de símbolos en Python para especificar o que queremos filtrar. Os corchetes "e "" serven para especificar un rango, por exemplo "0-9"( nótese que se quixésemos especificar un rango de 0 a 5 non se faría "0-5". Se queremos buscar un caracter simplemente o escribimos , sen ser dentro dun corchete (Ex: "a") , e se queremos un caracter dun conxunto deles, por exemplo saber se un string é unha vogal, escribiremos "aeiou". Un exemplo sería: import re if re.match("a","bsdadsadsa"): #como o primeiro caracter é un b falla print "YEAH" if re.match("a","a"): print "YEAH2" if re.match("a","basdasfdsfds"): #como o primeiro caracter é un b falla print "YEAH3" if re.match("a","a"): print "YEAH4" A saída do programa anterior sería YEAH2 e YEAH4 Nótese que tanto "a" , como "a" , como "asdsa" indican un só caracter dos que aparecen no patrón. No caso de que queiramos indicar que un carácter aparece máis dunha vez temos que usar un cuantificador, isto é , un símbolo colocado á dereita do que queiramos "cuantificar". Así, hai varios cuantificadores pero os máis importantes son "?" , "+", "*" , {m,n} e {m,n}? . Aplicándoos sempre ao que está inmediatamente á súa esquerda , o "?" siñifica 0 ou 1 repeticións, o "+", de 1 a n repeticións, o "*" , de 0 a n repeticións, "{m,n}" de m a n repeticións e "{m,n}?" fai o mesmo que o anterior salvo porque se atopa unha cadea que se repite m veces xa non comproba máis. Tamén existe "{n}" , para buscar un número exacto de repticións. Para especificar un rango de caracteres como 0-9 ou A-z hai un modo máis sinxelo de facelo: Python ten algúns ímbolos que actúan a modo de ''shortcuts (''atallos) para o programador. Agluns dos máis interesantes son \d (equivalente a 0-9) ou \w , que serviría para calquera caracter alfanumérico(números e letras maiñusculas ou minúsculas). O caracter "." serve para indicar calquerda caracter e o símbolo "^" indica comeza por e "$" indica remata por, de modo que unha expresión regular ben construída debería conter sempre "^" e "$" unha soa vez, ao principio e ao final da expresión respectivamente. Máis información O módulo re na documentación oficial: http://docs.python.org/library/re.html Sección Anexos desta mesma wiki , na parte de Expresións Regulares en python. Sockets Threads Bases de datos en Python Funcións útiles Programación orientada a obxectos: Clases Para definir unha clase en Python hai que escribir a palabra reservada class, logo o nome da clase seguido de ":" Así definiriámos a clase e escribiríamos os métodos e os atributos que considerásemos necesarios. Así, como mínimo , unha clase ten que ter un método init() , para poder crear obxectos da clase, aínda que é recomenda´bel contar con métodos get e set, para poder manexar atributos privados. O método init() O método init() en python é o que noutras linguaxes como C++ ou Java, dentro do POO(paradigma de orientación a obxectos) se denomina construtor, isto é, algo que nos serve para crear obxectos dunha mesma clase. Como no resto das linguaxes, un obxecto en Python non é máis que un tipo de dato ou estrutura que ten uns atributos e "capacidades" proporcionadas pola clase . Así, para crear un obxecto en Python simplemente escribiríamos nome_obxecto = Clase() , sendo Clase o nome da clase en cuestión. Público e privado Para comezar , dicir que en Python non existe "Protexido", isto é, todos os métodos poden ser públicos ou privados.(Tamén podénse ser privadas as variables ) Se un método é público quere dicir que se poderá acceder a el desde fora da clase , mentres que se é privado quere dicir que só se poderá acceder a el desde dentro da mesma clase. Para definir se un método é privado ou público faise no nome do método: isto é, para definir que é un me´todo é privado hai que poñer "__" antes do seu nome , todo o demáis será público. Un exemplo de o que ocorre se se intenta invocar a un método privado desde fóra da clase pódese ver aquí : >>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") Ao executar o código anterior daría o seguinte erro: Traceback (innermost last): File "", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse' É dicir, intenta aopar o atributo parse dentro da clase MP3FileInfo() pero como ese atributo é privado non o atopa. Instanciación Instanciar é o termo usado cando queremos usar un atributo ou método dunha clase fóra desta(sempre que sexa posíbel ten do en conta os permisos(público)). Así, cando se crea un obxecto da clase A() , por exemplo, os obxectos desa clase terán as variables definidas dentro da clase, polo que nome_obxecto.nome_atributo accederá ao atributo en cuestión. Se queremos acceder a un método escribiremos nome_obxecto.nome_modulo(parametros). Variables globais e locais Todo método usado dentro dunha clase ten que levar o parámetro ''self ''ademáis de calquera outro parámetro que teña. Así, se queremos diferenciar entre unha variable global e unha variable local a unha clase escribiremos self.nome_variable , referíndonos así á variable local. Se queremos usar a variable local simplemente non poñemos self. sen embargo, é posíbel facer isto doutro xeito, isto é , usando a palabra reservada ''global . ''Así, dentro dun método, se se declara unha variable como ''global nome_variable '', esa variable será global aínda que se declare dentro dun método. Decoradores Herdanza Programación funcional map, filter , zip e reduce Estas funcións son sobre todo útiles para traballar con obxectos da clase list.Na versión 3.x de Python recoméndase o uso de '' list comprehension '' en lugar destas funcións. Map é unha función que se usa para aplicar unha función a unha lista. A súa sintaxe é map(función, lista) , de xeito que aplicaría función a lista . Un exemplo sería map(float,a)#Convertiría "a" a float Filter sirve para comprobar se cada elemento dunha lista de elementos cumpre ou non unha condición.Así , a sintaxe sería filter(funcion, lista) , o que comprobaría que elementos de "lista" cumpren "funcion" . Un exemplo sería: >>> def odd(n): ... return n % 2 ... >>> li = 2, 3, 5, 9, 10, 256, -3 >>> filter(odd, li) 3, 5, 9, -3 Así, aplícase a función odd(n) á lista li, isto é, mira que números son divisíbeis entre 2 e devolve unha lista con aqueles elementos que cumpren a condición definida coa función. Zip é unha función bastante útil se queremos traballar con elementos de dúas listas e facer pares, isto é , zip funciona coma unha cremalleira(dahí o seu nome) e o que fai é , dadas dúas listas devolve unha terceira lista formada por pares de elementos de cada unha das listas que se lle pasan como parámetros en orde. A súa sintaxe sería zip(lista1,lista2) . Un exemplo sería: >>> a=1,2,3,4,5 >>> b=7,8,9,10,11 >>> c=zip(a,b) >>> c 7), (2, 8), (3, 9), (4, 10), (5, 11) A última das funcións útiles sobre listas é reduce , unha función cuxa sintaxe é reduce(funcion,lista) , que aplica unha función que lle especifiquemos a pares de elementos da lista que lle pasamso como parámetro ata que só quede un elemento. Así, é fácil deducir que sereía unha boa función a usar no caso de querer sumar tódolos elementos dunha lista. Un exemplo sería: def suma(x,y): return x+y a=1,2,3,4,5,6,7,8 b= reduce(suma,a) print b Funcións lambda O operador lambda serve para crear funcións anónimas en liña. Así, non poderán ser invocadas máis tarde. Son funcións creadas en tempo de execución que se usan instanciándoas nunha soa liña. A súa sintaxe é : lambda_form ::= lambda" parameter_list: expression old_lambda_form ::= "lambda" parameter_list: old_expression Así, escribiríamos “lambda”, logo os parámetros que recibe a función(sen especificar o tipo) , logo “:” e logo o que faga a función, todo nunha liña. O anterior sería equivalente a : def nome_funcion(parameter_list): return expresion As funcións lambda están restrinxidas pola sintaxe dunha soa expresión. Así, as funcións lambdas , como calquera outra cousa en python, son obxectos e poden ser tratadas como tales. Así, pódese gardar unha función lambda nunha variable: x= lambda p: math.sqr(p) Dese xeito, poderíamos ter sen problemas unha lista de funcións lambda , as cales serían obxectos volátiles , xa que esas funcións só existen no preciso momento de ser invocadas e non poden ser usadas externamente, desde ningunha outra parte do programa. Tamén é moi común usar funcións lambda coas funcións reduce , map e filter de python: res = reduce(lambda x, y: x+y, map(float,aux)) >>> foo = 18, 9, 22, 17, 24, 8, 12, 27 >>> >>> print filter(lambda x: x % 3 0, foo) 9, 24, 12, 27 Tamén sería posíbel usar unha función lambda dentro doutra función: >>>def make_incrementor (n): return lambda x: x+ n No exemplo anterior hai que ter en conta que a variable que usa a función lambda no return ten que pasárselle como parámetro á función principal, neste caso make_incrementor. O conxunto de expresión así accesíbeis coñécese como closure. Son útiles para reducir o código e facelo moito máis lexíbel, sendo un dos recursos máis usados do paradigma de programación funcional a pesar das limitacións das mesmas: non se pode usar ningún tipo de estrtutura repetitiva ou de decisión nunha función lambda. Iteradores Un interador é unh ferramenta que proporciona Python(ademáis de outras linguaxes) que serve para recorrer diversas estruturas. Así, un bucle en for en Python crea automaticamente un iterador. Para traballar con iterador é necesario o uso da clase ''iterable ''. Así, para crear un iterador podemos usar ''yield '' ou iter(variable) , onde variable é tipicamente un elemento da clase list. Para facer avanzar o iterador usaremos next() , poñendo ''nome_iterador.next(). Un exemplo sinxelo de uso sería: lista = 1,2,3,4,5 iter_lista=iter(lista) print(" Elemento: " + str(iter_lista.next())) print(" Elemento1: " + str(iter_lista.next())) print(" Elemento1: " + str(iter_lista.next())) print(" Elemento1: " + str(iter_lista.next())) for i in iter_lista: print (str(i)) É importante salientar que cada vez que se executa next(), o iterador avanza unha posición cara a dereita e borra o elemento no que se atope, de xeito que no caso anterior devolvería 5. Tamén é importante dicir que cando o interador no teña máis elementos sobre os que iterar(pásase da lonxitude da lista) salta unha excepción chamada StopIteration que se trata igual que o resto das excepcións, para máis información consultar o apartado desta wiki sobre excepcións. Aquí un exemplo un pouco máis complexo combinado co uso de funcións lambda: def apply_all(functions, item): # Definimos unha función que usaremos para apl#icar unha operacion a unha lista de funcions lambda for f in functions: yield f(item) #a palabra reservada yield crea un iterador , polo que nes #te caso creamos un iterador no momento de invocar á función functions = id, hex #lista de funcions lambda for result in apply_all(functions, 55): # Asi aplicariamos a lista de funcions #lambda ao número 55 print result Funcións útiles relacionadas cos iteradores Aparte das funcións propias da clase iterator , hai máis funcións útiles relacionadas cos iteradores. Se falamos de iteradores sobre diccionarios , iteritems() devolve un iterador sobre o par (clave, valor) dun diccionario, iterkeys() devolve un iterador sobre as claves dun diccionario e itervalues() devolve un iterador sobre os valores dun diccionario . Se queremos saber se tódolos elementos dun iterable son True , usaremos all() , e se queremos saber se algún elemento dun iterable é false usaremos any(). Hai varias funcións que crean iteradores eficientes de forma automática, pertencentes a itertools(URL na sección Máis información deste apartado). Máis información -Itertools: http://docs.python.org/library/itertools.html -Función all(): http://docs.python.org/library/functions.html#all -Función any(): http://docs.python.org/library/functions.html#any -Función frozenset(): http://docs.python.org/library/stdtypes.html#frozenset -Iterator types : http://docs.python.org/library/stdtypes.html#iterator-types Compresión de listas Módulos útiles Numpy Random Scypy Math Interfaces gráficas: o módulo wx Programación de videoxogos en Python Pygame Ben , o obxectivo desta parte da wiki é dar unha pequena introducción para a creación de xogos en python mediante o uso de Pygame. Antes de comezar, hai que instalar a librería pygame. Para ver a instalación en ubuntu mediante apt-get install visitar este enlace: http://pygame.org/wiki/kubuntu#Apt-get%20installation Unha vez feito iso incluiremos na cabeceira do noso código pygame: import pygame from pygame.locals import * Para programar usarase o paradigma de orientación a obxectos, de forma que que cada tipo de obxecto da clase será un obxecto. Ventá do xogo e fondo O primeiro paso para a creación do noso xogo é crear unha ventá na que mostraremos a acción.Así, usaremos para crear a ventá o seguinte: screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Super Beer Bros : Double Vision") Dese xeito asignaremos á variable screen unha ventá de dimensións WIDTH(ancho) e HEIGHT(alto) creada coa función pygame.display.set_mode() . É interesante que width e HEIGHT sexan constantes globais a menos que queiramos modificar o tamaño da ventá de xogo, algo improbábel. Para poñerelle un título á ventá usamos o pygame.display.set_caption() , que o que fai é poñer de título da ventá un string que se lle especifique. Facendo o anterior teríamos creada a nosa ventá, agora imos poñerlle un fondo. Para iso usaremos o seguinte: background_image =pygame.image.load('imaxe.jpg') screen.blit(background_image, (0, 0)) Co código anterior o que ocorrería é: cargaríamos a imaxe na variable background_image e "poñeríamola" sobre a pantalla con screen.blit() , indicando as coordenadas (0,0) . Así, screen.blit() serve para colocar calquera imaxe que queiramos sobre a pantalla, non só o fondo, de xeito que é posíbel superpoñer a imaxe dun persoanxe por encima dun fondo. Ren'py Programación Lóxica Programación Web Convenios á hora de programar en python Cando se escribe código en Python , hai que ter en conta unha serie de convenios que seven para facer o código moito máis lexíbel , algo moi importante para unha comprensión do código máis rápida e sinxela. Así, recoméndase usar 4 espazos por cada nivel de indentación , aínda que en código antigo pódese seguir a usar 8 espazos para indentar. Nunca mesturas tabuladores e espazos á hora de indentar o teu código, pode levar facilmente a confusión: usa só unha das dúas opcións. Recoméndase o uso de espazos en lugar de tabuladores pola súa maior compatibilidade con editores de texto. Todas as liñas teñen que ter 79 caracteres como máximo e para cadeas de texto longas é recomendábel limitar o ancho a 72 caracteres. As definicións de clases e as funcións non anidadas sepáranse con dúas liñas en branco. Sen embargo, non é necesario separar funcións con liñas en branco se son funcións sen implementación . Respeito do código de caracteres a usar, en Python 2.X recoméndase usar ASCII ou Latin-1 pero para Python 3.X recoméndase usar UTF-8. Os import debería colocarse en distintas liñas, na parte superior do arquivo . Relacionado con isto está o feito de que é mellor usar direccionamente absoluto que relativo nos imports. Á hora de usar parénteses, non usar espazos en branco ( Ex: (4) e non ( 4 ) ), aínda que poden ser usados espazos para separar os distintos elementos dentro do paréntese. Relacionado co tema dos espacios en branco, está o de que non é recomendábel poñer espazos cando se ten un caracter "=" para indicar o nome dunha variable, pero sí é recomendábel facelo ao usar caracteres como "*=" , sendo o máis aceptado algo como 3 *= 5 que 3*=5 . Usa sempre o operador """ para definir o que fai cada un dos teus métodos , o que facilita acceder á súa documentación con dir() Anexos Todo o material aquí citado pertence aos seus respeitivos autores cos dereitos que elen establezan e recoñezo ter usado o mesmo nesta wiki. Built-in functions in Python(funcións por defecto de Python): http://docs.python.org/library/functions.html Listado de módulos útiles en Python: http://mundogeek.net/archivos/2007/07/31/modulos-python/ Listado de tódolos módulos de Python: http://pypi.python.org/pypi Índice da documentación oficial de Python: http://docs.python.org/index.html Learn Python the hard way: http://learnpythonthehardway.org/ Documentación de Pygame: http://pygame.org/docs/ Documentación de RenPy: http://renpy.org/doc/html/ Python para todos(mundogeek): http://mundogeek.net/etiqueta/python+tutorial/ Expresións regulares en Python: http://www.regular-expressions.info/python.html Stack Overflow: http://stackoverflow.com/ Guía de estilo en Python: http://mundogeek.net/traducciones/guia-estilo-python.htm Inmersión en Python: http://www.gulic.org/almacen/diveintopython-5.4-es/ Categoría:Python Categoría:Linguaxes de Programación